package cn.tedu.loding.service.impl;

import cn.tedu.loding.ex.ServiceException;
import cn.tedu.loding.mapper.AddressMapper;
import cn.tedu.loding.pojo.dto.AddressAddNewDTO;
import cn.tedu.loding.pojo.dto.AddressUpdateDTO;
import cn.tedu.loding.pojo.entity.Address;
import cn.tedu.loding.pojo.vo.AddressListItemVO;
import cn.tedu.loding.pojo.vo.AddressStandardVO;
import cn.tedu.loding.service.IAddressService;
import cn.tedu.loding.web.ServiceCode;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * 处理收货地址数据的业务实现类
 *
 */
@Slf4j
@Service
public class AddressServiceImpl implements IAddressService {

    @Autowired
    private AddressMapper addressMapper;

    public AddressServiceImpl() {
        log.debug("创建业务对象：AddressServiceImpl");
    }

    // 分页查询所有收货地址信息的方法
    // 参数page是页码,pageSize是每页条数
    public PageInfo<AddressListItemVO> getAllAddressByPage(Integer page, Integer pageSize){
        // Pagehepler框架实现分页功能最核心的代码,是要编写在执行查询数据库代码之前的
        // PageHelper.startPage方法就是在设置分页的查询条件
        // page是查询的页码(从1开始),pageSize是每页条数
        PageHelper.startPage(page,pageSize);
        // 上面设置好分页查询条件,下面的查询在执行时,sql语句会自动被追加limit关键字
        List<AddressListItemVO> list= addressMapper.list();

        // list变量并不是全查结果,而是只包含指定页码内容的数据
        // 我们分页业务功能不能只返回分页查询结果,还需要提供分页信息
        // PageHelper框架提供了PageInfo类,既能保存分页结果,也能保存分页信息
        // 分页信息无需我们计算,直接实例化PageInfo对象,它会自动根据上面的查询生成
        return new PageInfo<>(list);
    }

    @Override
    public void addNew(AddressAddNewDTO addressAddNewDTO) {
        log.debug("开始处理【添加收货地址】的业务，参数：{}", addressAddNewDTO);
        Address address = new Address();
        BeanUtils.copyProperties(addressAddNewDTO,address);
        int rows = addressMapper.insert(address);
        if(rows != 1){
            String message = "添加收货地址失败，服务器忙，请稍后再试！";
            log.debug(message);
            throw new ServiceException(ServiceCode.ERR_INSERT, message);
        }
    }

    @Override
    public void delete(Long id) {
        log.debug("开始处理【根据id删除收货地址】的业务，参数：{}", id);
        AddressStandardVO address = addressMapper.getStandardById(id);
        if(address == null){
            String message = "删除收货地址失败，此收货地址不存在！";
            log.debug(message);
            throw new ServiceException(ServiceCode.ERR_NOT_FOUND, message);
        }
        int rows = addressMapper.deleteById(id);
        if(rows != 1){
            String message = "删除收货地址失败，服务器忙，请稍后再试！";
            log.debug(message);
            throw new ServiceException(ServiceCode.ERR_DELETE, message);
        }
    }

    @Override
    public void updateById(AddressUpdateDTO addressUpdateDTO) {
        AddressUpdateDTO userAddress=new AddressUpdateDTO();
        BeanUtils.copyProperties(addressUpdateDTO,userAddress);
        log.debug("地址修改时的数据：{}",userAddress);
        int rows=addressMapper.updateById(userAddress);
        //判断修改数据的结果是否符合预期
        if(rows!=1){
            String message = "更新地址信息失败，服务器忙，请稍后再次尝试！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_UPDATE, message);
        }
    }

    @Override
    public AddressStandardVO getStandardById(Long id) {
        log.debug("开始处理【根据id查询收货地址详情】的业务，参数：{}", id);
        AddressStandardVO address = addressMapper.getStandardById(id);
        if (address == null) {
            String message = "获取收货地址详情失败，尝试访问的数据不存在！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_NOT_FOUND, message);
        }
        return address;
    }

    @Override
    public List<AddressListItemVO> list() {
        log.debug("开始处理【查询收货地址列表】的请求,无参数");
        return addressMapper.list();
    }

    @Override
    public List<AddressListItemVO> listByUserId(Long userId) {
        log.debug("开始处理【查询指定用户收货地址列表】的请求：{}",userId);
        return addressMapper.listByUserId(userId);
    }

}
